package fr.auzaiphe.admin.model;

import java.util.ArrayList;

import fr.auzaiphe.admin.constantes.ConstantesAdmin;
import fr.auzaiphe.commun.Model;

public abstract class ChronoAdmin extends Chrono
{
	protected ArrayList<FlagAlerte> flagAlertes;
	protected static Historique historique; //Tous les chronometres pointent sur le même historique.

	public ChronoAdmin(Model pModel)
	{
		super(pModel);
		this.flagAlertes = new ArrayList<FlagAlerte>();
	}

	public ChronoAdmin(int pTempsRestant, Model pModel)
	{
		super(pTempsRestant, pModel);
		this.flagAlertes = new ArrayList<FlagAlerte>();
	}

	/**
	 * addFlagAlertes : Ajoute une alerte et sa date d'activation dans la liste flagAlertes du chrono.
	 * @param pAlerte : Alerte a cibler
	 * @param pHeure : Heure d'activation de l'alerte a cibler.
	 * @return
	 * 		- false si une même alerte à activer à la même heure était dans la liste de flagAlertes
	 * 		- true si l'alerte a été ajoutée et était nouvelle.
	 */
	public boolean addFlagAlertes(Alerte pAlerte, int pHeure)
	{
		FlagAlerte flagAlerteTmp = new FlagAlerte(pAlerte,pHeure);
		if(!this.flagAlertes.contains(flagAlerteTmp))
		{
			this.flagAlertes.add(flagAlerteTmp);
			return true;
		}
		return false;
	}

	/**
	 * rmvFlagAlertes : Retire une alerte à activer à une heure indiquée dans la liste de flagAlertes
	 * @param pAlerte : Alerte à supprimer
	 * @param pHeure : Heure de l'alerte à supprimer
	 * @return
	 * 		- false si le flag n'existait pas dans la liste flagAlertes.
	 * 		- true si le flag a été supprimé.
	 */
	public boolean rmvFlagAlertes(Alerte pAlerte, int pHeure)
	{
		int i=0;
		FlagAlerte flagAlerteTmp = new FlagAlerte(pAlerte,pHeure);
		if(this.flagAlertes.contains(flagAlerteTmp))
			for(FlagAlerte fa : this.flagAlertes)
			{
				if(fa.equals(flagAlerteTmp))
				{
					this.flagAlertes.remove(i);
					return true;
				}
				i++;
			}
		return false;
	}

	/**
	 * Mise en place de la reference vers l'historique.
	 * @param pHisto
	 */
	public void envoyerAlerte( Alerte pAlerte )
	{
		//Par défaut met une notification a l'admin
		historique.addEvtAlerte(this.getSecondesRestantes(), ConstantesAdmin.COLOR_EVT_ALERTE, pAlerte);

		//Envoie l'alerte quoi qu'il arrive si elle cible tout le monde
		if (pAlerte.isTargetingAll())
		{
			((AdminModel) this.model).sendAlerte(pAlerte);
		}
		//Si l'alerte cible un joueur
		else if (!pAlerte.isTargetingAll() && !pAlerte.isTargetingAdmin())
		{
			//Si le joueuer n'est pas connecté, alerte en liste d'attente
			if (((AdminModel) this.model).getIdJoueurAuthentifier() != pAlerte.getCible().getId())
			{
				pAlerte.getCible().getListAlerteNonVisualiser().add(pAlerte);
			}
			//Si le joueur est connecté
			else
			{
				((AdminModel) this.model).sendAlerteJoueur(pAlerte);
			}
		}
	}

	/**
	 * checkSendAlerte :
	 * Parcours la liste d'alerte et envoie celle qui doivent être envoyée
	 */
	public void checkSendAlerte()
	{
		for( FlagAlerte flA : this.flagAlertes )
			if( flA.getHeure() == this.getSecondesRestantes() )
				this.envoyerAlerte( flA.getAlerte() );
	}

	/**
	 * Ajout d'un evenement de connexion dans l'historique
	 * @param pJoueur
	 * @param pType
	 */
	public void addEvtConnexion(Joueur pJoueur, boolean pType)
	{
		if(pType)
			historique.addEvtConnexionJoueur(this.tempsRestant, ConstantesAdmin.COLOR_EVT_CONNEXION, pJoueur);
		else
			historique.addEvtDeconnexionJoueur(this.tempsRestant, ConstantesAdmin.COLOR_EVT_CONNEXION, pJoueur);
	}

	public void addEvtDecouverteIndice(Joueur j, Indice i)
	{
		historique.addEvtDecouverteIndice(this.tempsRestant, ConstantesAdmin.COLOR_EVT_DECOUVERTE_INDICE, j, i);
	}
	
	/*
	 * Guetters & Setters
	 */
	/**
	 * getFlagAlertes
	 * @return Retourne la liste des alertes dépendantes du chrono.
	 */
	public ArrayList<FlagAlerte> getFlagAlertes()
	{
		return this.flagAlertes;
	}

	public static void setHistorique(Historique pHisto)
	{
		historique = pHisto;
	}

}
